/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package stud.cp.user.plugins.weapon;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.ejb.Stateless;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import stud.cp.core.dbaccess.DAOException;
import stud.cp.core.plugins.PluginConst;
import stud.cp.core.plugins.PluginRouter;
import stud.cp.core.plugins.WrongPageRequest;
import stud.cp.user.dbaccess.HistoryDAO;
import stud.cp.user.dbaccess.OracleDAOFactory;
import stud.cp.user.dbaccess.PropertyListValuesDAO;
import stud.cp.user.dbaccess.PropertyValueDAO;
import stud.cp.user.dbaccess.WeaponDAO;
import stud.cp.user.dbaccess.WeaponReferencesDAO;
import stud.cp.user.valueobjects.History;
import stud.cp.user.valueobjects.Property;
import stud.cp.user.valueobjects.PropertyListValue;
import stud.cp.user.valueobjects.PropertyTypeDef;
import stud.cp.user.valueobjects.PropertyValue;
import stud.cp.user.valueobjects.User;
import stud.cp.user.valueobjects.Weapon;
import stud.cp.user.valueobjects.WeaponReference;
import stud.cp.user.valueobjects.WeaponType;

/**
 * Класс, отвечающий за логику работы
 * элемента выводящего списки оружия.
 * @author Morfant
 */
@Stateless
public class WeaponPluginBean implements WeaponPluginLocal {

    /**
     * Фабрика DAO классов.
     */
    private OracleDAOFactory oracleDAOFactory = null;
    /**
     * Логгер.
     */
    private static Logger logger = Logger.getLogger("CPTNP");

    /**
     * Метод, который выполняет
     * конкретые действия,
     * заложенные в плагин.
     * @param req Реквест.
     * @return Класс, роутер.
     */
    @Override
    public PluginRouter perform(HttpServletRequest req) {
        String subaction = req.getParameter(PluginConst.SUBACTION);
        if ((subaction != null) && (!subaction.equals(""))) {

            try {

                oracleDAOFactory = new OracleDAOFactory();
                oracleDAOFactory.initialize();

                /* Список действий которые могут выполниться. */
                if (subaction.equals(PluginConst.GET_WEAPON_TYPE_LIST_PAGE)) {
                    return getWeaponTypeListPage(req);
                }

                /*Список оружия конкретного типа оружуия */
                if (subaction.equals(PluginConst.GET_LIST)) {
                    return getListPage(req);
                }

                /*Страница добавления*/
                if (subaction.equals(PluginConst.GET_ADD_PAGE)) {
                    return getAddPage(req);
                }

                /*Добавление новых данных*/
                if (subaction.equals(PluginConst.NEW_DATA)) {
                    return newData(req);
                }


                /*Страница редактирования*/
                if (subaction.equals(PluginConst.GET_EDIT_PAGE)) {
                    return getEditPage(req);
                }

                /*Сохранение измененных данных*/
                if (subaction.equals(PluginConst.SAVE_DATA)) {
                    return saveData(req);
                }

                /*Страница удаления*/
                if (subaction.equals(PluginConst.GET_DELETE_PAGE)) {
                    return getDeletePage(req);
                }

                /*Удаление данные*/
                if (subaction.equals(PluginConst.DELETE_DATA)) {
                    return deleteData(req);
                }

                /*Страница просмотра данных о типе оружия*/
                if (subaction.equals(PluginConst.GET_VIEW_PAGE)) {
                    return getViewPage(req);
                }

                /*Страница истории*/
                if (subaction.equals(PluginConst.GET_HISTORY_PAGE)) {
                    return getHistoryPage(req);
                }

                req.setAttribute(PluginConst.ERROR_MESSAGE,
                        "Действия для данного типа поддействия не найдено. Тип поддействия = " + subaction);
            } catch (DAOException ex) {
                logger.debug("Error due access to database. "
                        + "Plugin = WeaponTypePluginBean. "
                        + "Subaction=" + subaction, ex);
                req.setAttribute(PluginConst.ERROR_MESSAGE,
                        "Ошибка доступа к базе данных " + ex.getMessage());
            } catch (WrongPageRequest ex) {
                req.setAttribute(PluginConst.ERROR_MESSAGE,
                        "Данные из реквеста ошибочны :\n" + ex.getMessage());
            } finally {
                if (oracleDAOFactory != null) {
                    try {
                        oracleDAOFactory.cleanUp();
                    } catch (DAOException ex) {
                        logger.debug("Error due access to database. "
                                + "Plugin = WeaponTypePluginBean. "
                                + "Subaction=" + subaction, ex);
                        req.setAttribute(PluginConst.ERROR_MESSAGE,
                                "Ошибка доступа к данным. " + ex.getMessage());
                    }
                }
            }
        } else {
            req.setAttribute(PluginConst.ERROR_MESSAGE,
                    "Тип поддействия не задан.");
        }
        return new PluginRouter("/errorpage.jsp");
    }

    /**
     * Метод, который позволяет получить
     * список данных запрашиваемого типа.
     * @param req Реквест.
     * @return PluginRouter на страницу в который будет выводиться список.
     * @throws DAOException Ошибки доступа к базе данных.
     */
    private PluginRouter getWeaponTypeListPage(HttpServletRequest req) throws DAOException, WrongPageRequest {
        req.setAttribute(PluginConst.WEAPON_TYPES_LIST, oracleDAOFactory.getWeaponTypesDAO().getAll());
        return new PluginRouter("/Weapon/WeaponTypesTable.jsp");
    }

    /**
     * Метод, который позволяет получить
     * список данных запрашиваемого типа.
     * @param req Реквест.
     * @return PluginRouter на страницу в который будет выводиться список.
     * @throws DAOException Ошибки доступа к базе данных.
     */
    private PluginRouter getListPage(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String weapon_type_id = req.getParameter(PluginConst.WEAPON_TYPE_ID);
        if (weapon_type_id != null) {
            WeaponType weaponType =
                    oracleDAOFactory.getWeaponTypesDAO().getById(new Integer(weapon_type_id));
            if (weaponType != null) {
                List<Weapon> listOfWeapon =
                        oracleDAOFactory.getWeaponDAO().getAllWeaponByWeaponType(new Integer(weapon_type_id));
                req.setAttribute(PluginConst.WEAPONS_LIST, listOfWeapon);
                req.setAttribute(PluginConst.WEAPON_TYPE, weaponType);
                return new PluginRouter("/Weapon/WeaponsTable.jsp");
            } else {
                throw new WrongPageRequest("Тип оружия с таким id=" + weapon_type_id + " не существует. ");
            }
        } else {
            throw new WrongPageRequest("ID свойства не задан.");
        }
    }

    /**
     * Метод, который позволяет получить
     * страницу добавления.
     * @param req Реквест.
     * @return PluginRouter c запрашиваемой страницей.
     * @throws DAOException Ошибка доступа к базе данных.
     */
    private PluginRouter getAddPage(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String weapon_type_id = req.getParameter(PluginConst.WEAPON_TYPE_ID);
        if (weapon_type_id != null) {
            WeaponType weaponType =
                    oracleDAOFactory.getWeaponTypesDAO().getById(new Integer(weapon_type_id));
            if (weaponType != null) {
                Map<Integer, List> mapOfPropertiesValues = new HashMap<Integer, List>();
                List<Property> listOfProperties =
                        oracleDAOFactory.getPropertiesDAO().getAllPropertyForWeaponType(new Integer(weapon_type_id));
                String propertyType = "";
                PropertyTypeDef propertyTypeDef = null;
                for (Property item : listOfProperties) {
                    if (item.getProperty_type_defs_id() != null) {
                        propertyTypeDef =
                                oracleDAOFactory.getPropertyTypeDefsDAO().getById(item.getProperty_type_defs_id());
                        propertyType = item.getProperty_type_id().toString();
                        if (propertyType.equals(PluginConst.REFERENCE_TYPE)) {
                            mapOfPropertiesValues.put(item.getProperty_id(),
                                    oracleDAOFactory.getWeaponDAO().getAllWeaponByWeaponType(propertyTypeDef.getWeapon_type_id()));
                        }
                        if (propertyType.equals(PluginConst.LIST_TYPE)) {
                            mapOfPropertiesValues.put(item.getProperty_id(),
                                    oracleDAOFactory.getPropertyListValuesDAO().getAllForListValueDef(propertyTypeDef.getProperty_type_def_id()));
                        }
                    }
                }
                req.setAttribute(PluginConst.PROPERTIES_LIST, listOfProperties);
                req.setAttribute(PluginConst.PROPERTY_VALUE_RESORSES, mapOfPropertiesValues);
                req.setAttribute(PluginConst.WEAPON_TYPE, weaponType);
                return new PluginRouter("/Weapon/AddWeapon.jsp");
            } else {
                throw new WrongPageRequest("Тип оружия с таким id=" + weapon_type_id + " не существует. ");
            }
        } else {
            throw new WrongPageRequest("ID свойства не задан.");
        }
    }

    /**
     * Метод, позволяющий добавлять новые данные.
     * @param req Реквест.
     * @return PluginRouter c запрашиваемой страницей.
     * @throws DAOException Ошибка доступа к базе данных.
     * @throws WrongPageRequest Критическая ошибка в данных реквеста.
     */
    private PluginRouter newData(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String name = req.getParameter(PluginConst.WEAPON_NAME);
        String description = req.getParameter(PluginConst.WEAPON_DESCRIPTION);
        String weapon_type_id = req.getParameter(PluginConst.WEAPON_TYPE_ID);
        String error_message = "";
        if ((name == null) || (name.equals(""))) {
            error_message = error_message + "Имя оружия не должно быть пустым!";
        }
        if ((description == null) || (description.equals(""))) {
            error_message = error_message + " Описание оружия не должно быть пустым.";
        }
        if (error_message.equals("")) {
            WeaponType weaponType = oracleDAOFactory.getWeaponTypesDAO().getById(new Integer(weapon_type_id));
            if (weaponType != null) {
                Integer weapon_id =
                        oracleDAOFactory.getWeaponDAO().create(new Weapon(weaponType.getWeapon_type_id(), name, description));
                List<Property> listOfProperties =
                        oracleDAOFactory.getPropertiesDAO().getAllPropertyForWeaponType(weaponType.getWeapon_type_id());
                Integer property_id = null;
                String value = "";
                PropertyValueDAO propertyValueDAO = oracleDAOFactory.getPropertyValueDAO();
                WeaponReferencesDAO weaponReferenceDAO = oracleDAOFactory.getWeaponReferencesDAO();
                PropertyListValuesDAO propertyListValuesDAO = oracleDAOFactory.getPropertyListValuesDAO();
                WeaponDAO weaponDAO = oracleDAOFactory.getWeaponDAO();
                HistoryDAO historyDAO = oracleDAOFactory.getHistoryDAO();
                String propertyType = "";
                User user = (User) req.getSession(false).getAttribute(PluginConst.USER);
                for (Property item : listOfProperties) {
                    property_id = item.getProperty_id();
                    propertyType = item.getProperty_type_id().toString();
                    if (propertyType.equals(PluginConst.TEXT_TYPE)) {
                        value = req.getParameter(property_id.toString());
                        propertyValueDAO.create(new PropertyValue(property_id, value, weapon_id, null));
                        historyDAO.create(new History(weapon_id,
                                item.getProperty_id(),
                                user.getUserID(),
                                new Date(System.currentTimeMillis()),
                                value,
                                ""));
                    }
                    if (propertyType.equals(PluginConst.REFERENCE_TYPE)) {
                        value = req.getParameter(property_id.toString());
                        if (!value.equals(PluginConst.DEFAULT_REFERENCE_ID)) {
                            weaponReferenceDAO.create(new WeaponReference(weapon_id, new Integer(value), property_id));
                            historyDAO.create(new History(weapon_id,
                                    item.getProperty_id(),
                                    user.getUserID(),
                                    new Date(System.currentTimeMillis()),
                                    weaponDAO.getById(new Integer(value)).getName(),
                                    ""));
                        }
                        propertyValueDAO.create(new PropertyValue(property_id, "", weapon_id, null));
                    }
                    if (propertyType.equals(PluginConst.LIST_TYPE)) {
                        value = req.getParameter(property_id.toString());
                        propertyValueDAO.create(new PropertyValue(property_id, "", weapon_id, new Integer(value)));
                        historyDAO.create(new History(weapon_id,
                                item.getProperty_id(),
                                user.getUserID(),
                                new Date(System.currentTimeMillis()),
                                propertyListValuesDAO.getById(new Integer(value)).getValue(),
                                ""));
                    }
                }
                return new PluginRouter("weapon-action.do"
                        + "?"
                        + PluginConst.SUBACTION
                        + "="
                        + PluginConst.GET_VIEW_PAGE
                        + "&"
                        + PluginConst.WEAPON_ID
                        + "="
                        + weapon_id, false);
            } else {
                throw new WrongPageRequest("Тип оружия с таким id=" + weapon_type_id + " не существует. ");
            }
        } else {
            req.setAttribute(PluginConst.ERROR_MESSAGE, error_message);
            return getAddPage(req);
        }
    }

    /**
     * Метод, который позволяет
     * перейти на страницу редактирования данных.
     * @param req Реквест.
     * @return PluginRouter c запрашиваемой страницей.
     * @throws DAOException Ошибка доступа к базе данных.
     * @throws WrongPageRequest Критическая ошибка в данных реквеста.
     */
    private PluginRouter getEditPage(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String weapon_id = req.getParameter(PluginConst.WEAPON_ID);
        if (weapon_id != null) {
            Weapon weapon =
                    oracleDAOFactory.getWeaponDAO().getById(new Integer(weapon_id));
            if (weapon != null) {
                Map<Integer, List> mapOfPropertiesValues = new HashMap<Integer, List>();
                List<PropertyValue> listOfPropertyValue =
                        oracleDAOFactory.getPropertyValueDAO().getPropertyValueForWeapon(new Integer(weapon_id));
                List<WeaponReference> listOfWeaponReference =
                        oracleDAOFactory.getWeaponReferencesDAO().getAllReferenceForWeapon(new Integer(weapon_id));
                List<Property> listOfProperties =
                        oracleDAOFactory.getPropertiesDAO().getAllPropertyForWeaponType(weapon.getWeapon_type_id());
                Map<Integer, Weapon> referenceWeaponMap = new HashMap<Integer, Weapon>();
                WeaponDAO weaponDAO = oracleDAOFactory.getWeaponDAO();
                for (WeaponReference item : listOfWeaponReference) {
                    referenceWeaponMap.put(item.getProperty_id(), weaponDAO.getById(item.getReference_weapon_id()));
                }
                String propertyType = "";
                PropertyTypeDef propertyTypeDef = null;
                for (Property item : listOfProperties) {
                    if (item.getProperty_type_defs_id() != null) {
                        propertyTypeDef =
                                oracleDAOFactory.getPropertyTypeDefsDAO().getById(item.getProperty_type_defs_id());
                        propertyType = item.getProperty_type_id().toString();
                        if (propertyType.equals(PluginConst.REFERENCE_TYPE)) {
                            mapOfPropertiesValues.put(item.getProperty_id(),
                                    oracleDAOFactory.getWeaponDAO().
                                    getAllWeaponByWeaponTypeExcludeWeapon(propertyTypeDef.getWeapon_type_id(), weapon.getWeapon_id()));
                        }
                        if (propertyType.equals(PluginConst.LIST_TYPE)) {
                            mapOfPropertiesValues.put(item.getProperty_id(),
                                    oracleDAOFactory.getPropertyListValuesDAO().getAllForListValueDef(propertyTypeDef.getProperty_type_def_id()));
                        }
                    }
                }
                req.setAttribute(PluginConst.WEAPON, weapon);
                req.setAttribute(PluginConst.PROPERTY_VALUES_LIST, listOfPropertyValue);
                req.setAttribute(PluginConst.REFERENCE_WEAPON_RESORSES, referenceWeaponMap);
                req.setAttribute(PluginConst.PROPERTY_VALUE_RESORSES, mapOfPropertiesValues);
                return new PluginRouter("/Weapon/EditWeapon.jsp");
            } else {
                throw new WrongPageRequest("Оружия с таким id=" + weapon_id + " не существует. ");
            }
        } else {
            throw new WrongPageRequest("ID типа оружия не заданно.");
        }
    }

    /**
     * Сохранение данных.
     * @param req Реквест.
     * @return PluginRouter c запрашиваемой страницей.
     * @throws DAOException Ошибка доступа к базе данных.
     * @throws WrongPageRequest Критическая ошибка в данных реквеста.
     */
    private PluginRouter saveData(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String name = req.getParameter(PluginConst.WEAPON_NAME);
        String description = req.getParameter(PluginConst.WEAPON_DESCRIPTION);
        String weapon_id = req.getParameter(PluginConst.WEAPON_ID);
        String error_message = "";
        if ((name == null) || (name.equals(""))) {
            error_message = error_message + "Имя оружия не должно быть пустым!";
        }
        if ((description == null) || (description.equals(""))) {
            error_message = error_message + " Описание оружия не должно быть пустым.";
        }
        if (error_message.equals("")) {
            Weapon weapon = oracleDAOFactory.getWeaponDAO().getById(new Integer(weapon_id));
            if (weapon != null) {
                weapon.setName(name);
                weapon.setDescription(description);
                oracleDAOFactory.getWeaponDAO().update(weapon);
                PropertyValueDAO propertyValueDAO = oracleDAOFactory.getPropertyValueDAO();
                WeaponReferencesDAO weaponReferenceDAO = oracleDAOFactory.getWeaponReferencesDAO();
                HistoryDAO historyDAO = oracleDAOFactory.getHistoryDAO();
                PropertyListValuesDAO propertyListValuesDAO = oracleDAOFactory.getPropertyListValuesDAO();
                WeaponDAO weaponDAO = oracleDAOFactory.getWeaponDAO();
                WeaponReference weaponReference = null;
                List<PropertyValue> listOfPropertyValues =
                        propertyValueDAO.getPropertyValueForWeapon(weapon.getWeapon_id());
                String newValue = "";
                String oldValue = "";
                String propertyType = "";
                User user = (User) req.getSession(false).getAttribute(PluginConst.USER);
                for (PropertyValue item : listOfPropertyValues) {
                    newValue = req.getParameter(item.getProperty_value_id().toString());
                    propertyType = item.getProperty_type_id().toString();

                    /* Работа с текстовыми свойствами. */
                    if (propertyType.equals(PluginConst.TEXT_TYPE)) {
                        oldValue = (item.getValue() != null) ? item.getValue() : "";

                        /* Проверка на необходимость изменениея данных. */
                        if (!newValue.equals(oldValue)) {
                            historyDAO.create(new History(weapon.getWeapon_id(),
                                    item.getProperty_id(),
                                    user.getUserID(),
                                    new Date(System.currentTimeMillis()),
                                    newValue,
                                    oldValue));
                            item.setValue(newValue);
                            propertyValueDAO.update(item);
                        }
                    }

                    /* Работа со списочными свойствами. */
                    if (propertyType.equals(PluginConst.LIST_TYPE)) {
                        oldValue = (item.getProperty_list_value_id() != null)
                                ? item.getProperty_list_value_id().toString() : "";

                        /* Проверка на необходимость изменениея данных. */
                        if (!newValue.equals(oldValue)) {
                            historyDAO.create(new History(weapon.getWeapon_id(),
                                    item.getProperty_id(),
                                    user.getUserID(),
                                    new Date(System.currentTimeMillis()),
                                    propertyListValuesDAO.getById(new Integer(newValue)).getValue(),
                                    (!oldValue.equals(""))
                                    ? item.getProperty_list_value() : ""));
                            item.setProperty_list_value_id(new Integer(newValue));
                            propertyValueDAO.update(item);
                        }
                    }

                    /* Работа со ссылочными свойствами */
                    if (propertyType.equals(PluginConst.REFERENCE_TYPE)) {
                        weaponReference =
                                weaponReferenceDAO.getByWeaponIDAndPropertyID(weapon.getWeapon_id(), item.getProperty_id());

                        /* Определение необходимости изменения данных. */
                        if (!newValue.equals(PluginConst.DEFAULT_REFERENCE_ID)) {
                            if (weaponReference == null) {
                                historyDAO.create(new History(weapon.getWeapon_id(),
                                        item.getProperty_id(),
                                        user.getUserID(),
                                        new Date(System.currentTimeMillis()),
                                        weaponDAO.getById(new Integer(newValue)).getName(), ""));
                                weaponReferenceDAO.create(new WeaponReference(weapon.getWeapon_id(), new Integer(newValue), item.getProperty_id()));
                            } else {
                                if (!newValue.equals(weaponReference.getReference_weapon_id().toString())) {
                                    historyDAO.create(new History(weapon.getWeapon_id(),
                                            item.getProperty_id(),
                                            user.getUserID(),
                                            new Date(System.currentTimeMillis()),
                                            weaponDAO.getById(new Integer(newValue)).getName(),
                                            weaponDAO.getById(weaponReference.getReference_weapon_id()).getName()));
                                    weaponReference.setReference_weapon_id(new Integer(newValue));
                                    weaponReferenceDAO.update(weaponReference);
                                }
                            }

                        } else {
                            if ((weaponReference != null)
                                    && (!weaponReference.getReference_weapon_id().toString().
                                    equals(PluginConst.DEFAULT_REFERENCE_ID))) {
                                historyDAO.create(new History(weapon.getWeapon_id(),
                                        item.getProperty_id(),
                                        user.getUserID(),
                                        new Date(System.currentTimeMillis()),
                                        "",
                                        weaponDAO.getById(weaponReference.getReference_weapon_id()).getName()));
                                weaponReferenceDAO.delete(weaponReference.getWeapon_reference_id());
                            }
                        }
                    }
                }
                return new PluginRouter("weapon-action.do"
                        + "?"
                        + PluginConst.SUBACTION
                        + "="
                        + PluginConst.GET_VIEW_PAGE
                        + "&"
                        + PluginConst.WEAPON_ID
                        + "="
                        + weapon_id, false);
            } else {
                throw new WrongPageRequest("Оружия с таким id=" + weapon_id + " не существует. ");
            }
        } else {
            req.setAttribute(PluginConst.ERROR_MESSAGE, error_message);
            return getEditPage(req);
        }
    }

    /**
     * Метод, который позволяет
     * перейти на страницу удаления элемента.
     * @param req Реквест.
     * @return PluginRouter c запрашиваемой страницей.
     * @throws DAOException Ошибка доступа к базе данных.
     * @throws WrongPageRequest Критическая ошибка в данных реквеста.
     */
    private PluginRouter getDeletePage(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String weapon_id = req.getParameter(PluginConst.WEAPON_ID);
        if (weapon_id != null) {
            Weapon weapon = oracleDAOFactory.getWeaponDAO().getById(new Integer(weapon_id));
            if (weapon != null) {
                req.setAttribute(PluginConst.WEAPON, weapon);
                return new PluginRouter("/Weapon/DeleteWeapon.jsp");
            } else {
                throw new WrongPageRequest("Оружия с таким id=" + weapon_id + " не существует. ");
            }
        } else {
            throw new WrongPageRequest("ID  свойства не заданн.");
        }
    }

    /**
     * Метод, удаляющий данные из базы данных.
     * @param req Реквест.
     * @return PluginRouter c запрашиваемой страницей.
     * @throws DAOException Ошибка доступа к базе данных.
     * @throws WrongPageRequest Критическая ошибка в данных реквеста.
     */
    private PluginRouter deleteData(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String weapon_id = req.getParameter(PluginConst.WEAPON_ID);
        if (weapon_id != null) {
            Weapon weapon = oracleDAOFactory.getWeaponDAO().getById(new Integer(weapon_id));
            if (weapon != null) {
                oracleDAOFactory.getWeaponDAO().delete(new Integer(weapon_id));
                return new PluginRouter("weapon-action.do"
                        + "?"
                        + PluginConst.SUBACTION
                        + "="
                        + PluginConst.GET_LIST
                        + "&"
                        + PluginConst.WEAPON_TYPE_ID
                        + "="
                        + weapon.getWeapon_type_id(), false);
            } else {
                throw new WrongPageRequest("Оружия с таким id=" + weapon_id + " не существует. ");
            }
        } else {
            throw new WrongPageRequest("ID типа оружия не задано.");
        }
    }

    /**
     * Метод, который позволяет
     * перейти на страницу просмотра данных о элементе.
     * @param req Реквест.
     * @return PluginRouter c запрашиваемой страницей.
     * @throws DAOException Ошибка доступа к базе данных.
     * @throws WrongPageRequest Критическая ошибка в данных реквеста.
     */
    private PluginRouter getViewPage(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String weapon_id = req.getParameter(PluginConst.WEAPON_ID);
        if (weapon_id != null) {
            Weapon weapon =
                    oracleDAOFactory.getWeaponDAO().getById(new Integer(weapon_id));
            if (weapon != null) {
                List<PropertyValue> listOfPropertyValue =
                        oracleDAOFactory.getPropertyValueDAO().getPropertyValueForWeapon(new Integer(weapon_id));
                List<WeaponReference> listOfWeaponReference =
                        oracleDAOFactory.getWeaponReferencesDAO().getAllReferenceForWeapon(new Integer(weapon_id));
                Map<Integer, Weapon> referenceWeaponMap = new HashMap<Integer, Weapon>();
                WeaponDAO weaponDAO = oracleDAOFactory.getWeaponDAO();
                for (WeaponReference item : listOfWeaponReference) {
                    referenceWeaponMap.put(item.getProperty_id(), weaponDAO.getById(item.getReference_weapon_id()));
                }
                req.setAttribute(PluginConst.WEAPON, weapon);
                req.setAttribute(PluginConst.PROPERTY_VALUES_LIST, listOfPropertyValue);
                req.setAttribute(PluginConst.REFERENCE_WEAPON_RESORSES, referenceWeaponMap);
                return new PluginRouter("/Weapon/ViewWeapon.jsp");
            } else {
                throw new WrongPageRequest("Оружия с таким id=" + weapon_id + " не существует. ");
            }
        } else {
            throw new WrongPageRequest("ID типа оружия не заданно.");
        }
    }

    /**
     * Метод, который позволяет
     * просмотреть историю изменения данных об
     * оружии.
     * @param req Реквест.
     * @return PluginRouter c запрашиваемой страницей.
     * @throws DAOException Ошибка доступа к базе данных.
     * @throws WrongPageRequest Критическая ошибка в данных реквеста.
     */
    private PluginRouter getHistoryPage(HttpServletRequest req) throws DAOException, WrongPageRequest {
        String weapon_id = req.getParameter(PluginConst.WEAPON_ID);
        if (weapon_id != null) {
            Weapon weapon =
                    oracleDAOFactory.getWeaponDAO().getById(new Integer(weapon_id));
            if (weapon != null) {
                List<History> weaponHistory = oracleDAOFactory.getHistoryDAO().getAllForWeapon(weapon.getWeapon_id());
                req.setAttribute(PluginConst.WEAPON_ID, weapon.getWeapon_id());
                req.setAttribute(PluginConst.HISTORY_LIST, weaponHistory);
                return new PluginRouter("/Weapon/HistoryTable.jsp");
            } else {
                throw new WrongPageRequest("Оружия с таким id=" + weapon_id + " не существует. ");
            }
        } else {
            throw new WrongPageRequest("ID типа оружия не заданно.");
        }
    }
}
